package net.boot.smpp.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.extra.spring.SpringUtil;
import org.springframework.beans.factory.annotation.Value;
import lombok.extern.slf4j.Slf4j;
import net.boot.smpp.service.MessageGatewayService;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.springframework.stereotype.Service;

import java.util.LinkedHashMap;

/**
 * @author qiusu
 * @since 2025/8/29 09:39
 */
@Slf4j
@Service
public class MessageGatewayServiceImpl implements MessageGatewayService {

    @Value("${sms.default-configId}")
    private String default_configId;

    @Value("${sms.switch}")
    private boolean is_sms;

    /**
     * 业务功能实现方法，用于发送短信消息等业务逻辑。
     *
     * @param destAddress 目标地址（接收短信的手机号码或地址）
     * @param message     短信内容或包含短信配置信息的JSON字符串。
     *                    如果是JSON字符串，需包含以下字段：
     *                    - configId: 可选，指定短信服务的配置ID。
     *                    - templateId: 可选，指定短信模板ID。
     *                    - parameter: 可选，短信模板参数或直接的消息内容。
     * 该方法根据输入参数动态选择短信服务配置，并调用相应的短信发送接口。
     * 支持通过JSON格式传递复杂参数，适配不同的短信发送场景。
     */
    @Override
    public void business(String destAddress, String message) {
        //此处进行业务功能实现.例如：实现阿里云短信
        if(is_sms){
            sendSms(destAddress, message);
        }
        //此处实现其它业务逻辑处理.....
        //例如：发送邮件、发送微信消息、发送钉钉消息等等。
        otherBusiness(destAddress, message);

    }

    /**
     * 处理其他业务逻辑的私有方法。
     *
     * @param destAddress 目标地址，表示需要处理业务逻辑的目标位置或号码。
     * @param message     消息内容，表示与目标地址相关的业务消息或数据。
     *
     * TODO: 实现其他业务逻辑处理。
     */
    private void otherBusiness(String destAddress, String message) {
        // TODO: 实现其他业务逻辑处理
    }


    /**
     * 发送短信的私有方法。
     *
     * @param destAddress 目标地址（接收短信的手机号码）
     * @param message     短信内容或模板参数的JSON字符串，包含模板ID和参数信息
     * @return SmsResponse 短信发送结果的响应对象，包含发送状态和相关信息
     */
    private SmsResponse sendSms(String destAddress, String message) {
        // TODO: 实现发送短信逻辑
        SmsBlend smsBlend = SmsFactory.getSmsBlend(default_configId);
        SmsResponse smsResponse = null;
        if(JSONUtil.isTypeJSONObject(message)){
            JSONObject message_json = JSONUtil.parseObj(message);
            LinkedHashMap<String,String> parameter_map = null;
            String configId = message_json.getStr("configId");
            String config_pre = "sms.blends.{configId}.";
            if(StrUtil.isNotBlank(configId)){
                smsBlend = SmsFactory.getSmsBlend(configId);
                config_pre = config_pre.replace("{configId}",configId);
            }else {
                config_pre = config_pre.replace("{configId}",default_configId);
            }

            String templateId = message_json.getStr("templateId");
            String parameter = message_json.getStr("parameter");
            if(JSONUtil.isTypeJSONObject(parameter)){
                parameter_map = JSONUtil.toBean(JSONUtil.parseObj(parameter), LinkedHashMap.class);
            }
            if(StrUtil.isNotBlank(templateId)){
                if(CollUtil.isEmpty(parameter_map)){
                    parameter_map = getParameterMap(parameter,config_pre);
                }
                smsResponse = smsBlend.sendMessage(destAddress, templateId, parameter_map);
            }else {
                if(CollUtil.isNotEmpty(parameter_map)){
                    smsResponse = smsBlend.sendMessage(destAddress, parameter_map);
                }else {
                    smsResponse = smsBlend.sendMessage(destAddress, parameter);
                }
            }
        }else {
            smsResponse = smsBlend.sendMessage(destAddress, messageStrDeal(message));
        }

        if (smsResponse.isSuccess()) {
            log.info("发送 {} 消息成功 {}",destAddress,smsResponse);
        }else {
            log.error("发送 {} 消息失败 {}",destAddress,smsResponse);
        }
        return smsResponse;
    }


    /**
     * 根据供应商配置和参数生成一个包含特定映射的LinkedHashMap。
     *
     * @param parameter 传入的参数值，用于根据供应商逻辑填充到映射中。
     * @param config_pre 配置前缀，用于从配置文件中获取供应商相关的配置信息。
     * @return 返回一个LinkedHashMap，其中键值对根据供应商逻辑生成。
     *         如果供应商未实现逻辑或未知，则返回空的LinkedHashMap。
     */
    private LinkedHashMap<String,String> getParameterMap(String parameter, String config_pre) {
        // 初始化结果映射
        LinkedHashMap<String,String> parameter_map = new LinkedHashMap<>();
        // 获取供应商名称
        String supplier = SpringUtil.getProperty(config_pre + "supplier");
        // 根据供应商名称执行不同的逻辑
        switch (supplier) {
            case "alibaba": // 阿里云
                // 获取模板名称并将其与参数值存入映射
                String template_name = SpringUtil.getProperty(config_pre + "template-name");
                parameter_map.put(template_name, parameter);
                break;
            case "tencent": // 腾讯云
                // TODO: 实现腾讯云逻辑
                break;
            case "cloopen": // 容联云
                // TODO: 实现容联云逻辑
                break;
            case "ctyun": // 天翼云
                // TODO: 实现天翼云逻辑
                break;
            case "emay": // 亿美软通
                // TODO: 实现亿美软通逻辑
                break;
            case "huawei": // 华为云短信
                // TODO: 实现华为云短信逻辑
                break;
            case "jdcloud": // 京东云短信
                // TODO: 实现京东云短信逻辑
                break;
            case "netease": // 网易云信
                // TODO: 实现网易云信逻辑
                break;
            case "unisms": // 合一短信
                // TODO: 实现合一短信逻辑
                break;
            case "yunpian": // 云片短信
                // TODO: 实现云片短信逻辑
                break;
            case "zhutong": // 助通短信
                // TODO: 实现助通短信逻辑
                break;
            case "dingzhong": // 鼎众短信
                // TODO: 实现鼎众短信逻辑
                break;
            case "qiniu": // 七牛云短信
                // TODO: 实现七牛云短信逻辑
                break;
            case "chuanglan": // 创蓝短信
                // TODO: 实现创蓝短信逻辑
                break;
            case "jiguang": // 极光短信
                // TODO: 实现极光短信逻辑
                break;
            case "buding_v2": // 布丁云V2
                // TODO: 实现布丁云V2逻辑
                break;
            case "mas": // 中国移动 云MAS
                // TODO: 实现中国移动 云MAS逻辑
                break;
            case "baidu": // 百度云短信
                // TODO: 实现百度云短信逻辑
                break;
            case "luosimao": // 螺丝帽短信
                // TODO: 实现螺丝帽短信逻辑
                break;
            case "mysubmail": // SUBMAIL短信
                // TODO: 实现SUBMAIL短信逻辑
                break;
            case "danmi": // 单米短信
                // TODO: 实现单米短信逻辑
                break;
            default:
                // 记录未知供应商的日志信息
                log.warn("未知供应商: {}", supplier);
                break;
        }

        // 返回生成的映射
        return parameter_map;
    }

    /**
     * 处理消息字符串
     *
     * @param message 待处理的消息字符串
     * @return 处理后的消息字符串
     */
    private String messageStrDeal(String message) {
        //自定义处理

        return message;
    }

}
